It has become increasingly commonplace to use grids of numerous node devices to perform analyses of large data sets (e.g., what is commonly referred to as “big data”) in a distributed manner in which tasks of analysis routines are performed at least partially in parallel across multiple selected ones of the node devices. In operating such grids, there are often competing goals in assigning the tasks of analysis routines to the node devices, including the goal of making as full and uninterrupted use of the processing resources of each node device as possible, and the goal of making more effective use of the processing and storage resources of each node device, as well as of the network bandwidth resources of the grid. Adding to the complexity of addressing such competing goals is the common practice of sharing grid resources by causing the tasks of multiple analysis routines to be performed by the node devices of the grid at the same time. A classic approach to assigning tasks is to simply assign the next task to be performed to whichever node device is the next one to have available processing resources. Unfortunately, this classic approach represents a decision to allow considerable inefficiencies in the use of storage and network bandwidth resources.